<?php
/**
 * crcl/base
 *
 * Copyright 2013 CRCL - André Sabosch - info@crcl.de
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace crcl\base\resource\reader;

/**
 * dealing with data source names (DSN)
 *
 * dsn scheme:
 * dsn://user:password@host/database/table
 *
 * nyi:
 * #table
 */
interface IDsn
{
  public function getDatabase();
  public function getTable();
}

class ContainerDsn extends ContainerAccount implements IDsn
{
  public function getDatabase()
  {
    try
    {
      $sDatabase = $this->getPath();
    }
    catch (Exception $e)
    {
      if ($e->getCode() == Exception::ERROR_URI_NOPATH)
      {
        throw new Exception(
          'No database.',
          Exception::ERROR_DSN_NODATABASE,
          array('uri' => $this->sUri));
      }
      else
      {
        //not yet used, just to be sure
        //@codeCoverageIgnoreStart
        throw $e;
        //@codeCoverageIgnoreEnd
      }
    }

    $sDatabase = \crcl\base\String::factory($sDatabase)
      ->doNotStartWith('/')
      ->toString();
    $iPos = \strpos($sDatabase, '/');
    if ($iPos !== \FALSE)
    {
      $sDatabase = \substr($sDatabase, 0, $iPos);
    }
    return $sDatabase;
  }

  public function getTable()
  {
    $sDatabase = $this->getDatabase();
    $sPath = $this->getPath();
    $iPos = \strpos($this->getPath(), $sDatabase);
    $iPos += \strlen($sDatabase);

    $sTable = \substr($sPath, $iPos);

    $sTable = \crcl\base\String::factory($sTable)
                ->doNotStartWith('/')
                ->doNotEndWith('/')
                ->toString();
    return $sTable;
  }
}